package com.cskaoyan.javase.homework.primary._4oop2;

/**
 * @description: 多态语法的练习
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *  回答以下问题：
 * 	1，编写测试方法，
 * 		要求该方法允许传入SouthPerson对象和NorthPerson对象，并在方法体中调用它们的eat()方法，方法调用的结果一致吗？
 * 	        显然方法调用的结果是不一致的，方法调用结果要根据对象的具体类型而定。
 * 	        而SouthPerson和NorthPerson这两个类，都重写了继承的eat()方法。
 *
 * 	2，用父类引用指向子类对象的方式创建SouthPerson对象，能否直接访问salary属性和swim()方法？
 * 		如果不能，应该怎么写代码让它能够正常调用？
 * 	        显然是不能直接访问的，引用限制了访问范围。
 * 	        如果想要正常访问，需要进行强制类型转换。
 *
 * 	3，用父类引用指向子类对象的方式创建NorthPerson对象，能否（直接或写代码）访问salary属性和swim()方法？
 * 		如果不能，将该对象引用强转为SouthPerson引用，能否成功？为什么？
 * 	    不能，不在同一条继承链中的两个类没有任何关系。也不可能发生强转。
 *
 */
public class PolymorphicDemo {
    public static void main(String[] args) {
        NorthPerson np = new NorthPerson();
        SouthPerson sp = new SouthPerson();
        test(np);
        test(sp);
        Person p = new NorthPerson();
    }
    public static void test(Person p){
        p.eat();
    }
}

abstract class Person {
    String name;
    int age;
    public abstract void eat();
}

class SouthPerson extends Person {
    double salary;
    @Override
    public void eat() {
        System.out.println("南方人吃米饭");
    }
    public void swim(){
        System.out.println("南方人会游泳");
    }
}

class NorthPerson extends Person {
    double height;
    @Override
    public void eat() {
        System.out.println("北方人吃馒头");
    }
    public void drink(){
        System.out.println("北方人特别能喝酒");
    }
}
